// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build linux&&（mips64 | | mips64le）
// +build linux 
// +build mips64 mips64le 

package syscall

// /archonsorsr2捕捉到r2被
// /runtime.GOARCH尊重的事实。系统调用约定通常是r1、r2，err:=
// Syscall（陷阱，…）。并非所有架构都在
// ABI中定义r2。参见“人工系统调用”。
const archHonorsR2 = true

const _SYS_setgroups = SYS_SETGROUPS

// sys Dup2（旧fd int，新fd int）（错误）
// sysnb EPOLLCEATE（大小int）（fd int，错误）
// sys Fchown（fd int，uid int，gid int）（错误）
// sys Fstatfs（fd int，buf*StatfsÈt）（错误）
// sys FSTAAT（dirfd int，path string，path string，stat，stat*stat，flags int）（错误）=SYS_NEWFSTATAT 
// SYS Ftruncate（fd int，length int64）（错误）
// sysnb Getegid（）（egid int）
// sysnb Geteuid（）（euid int）
// sysnb Getgid（）（gid int）
// sysnb Getrlimit（resource int，rlim rlim*Rlimit）（错误）
// sysnb InotifyInit（）（fd int，error error）
// sys Lchown（path string，uid int，gid int）（error）
// sys Listen（s int，n int）（error error error）
// sys Pread（fd int，p[]字节，offset int64）（n int，error error error error）=sys PREAD64
// SYS Renameat（olddirfd int，oldpath string，newdirfd int，newpath string）（error）
// SYS Seek（fd int，offset int64，whence int）（off int64，error error）=SYS LSEEK 
// SYS sendfile（outd int，infd int，offset*int64，count int）（书面整数，错误错误）
// sys Setfsgid（gid int）（错误）
// sys Setfsuid（uid int）（错误）
// sysnb SETRLMIT（资源整数，rlim*RLMIT）（错误）
// sys Shutdown（fd int，how int）（错误）
// sys（rfd int，roff*int64，wfd int，woff*int64，len int，flags int）（n int64，error error）
// sys Statfs（path string，buf*Statfs_t）（error error）
// sys SyncFileRange（fd int，off int64，n int64，flags int）（error error）
// sys Truncate（path string，length int64）（error）
// sys accept（s int，rsa*RawSockaddrAny，addrlen*.\u Socklen）（fd int，error）
// sys accept4（s int，rsa*RawSockaddrAny，addrlen*.\u Socklen，flags int）（fd int，error）
// sys connect（s int，addr unsafe.Pointer，addrlenSocklen）（错误）
// sysnb getgroups（n int，list*Gidt）（nn int，error error）
// sys getsockopt（s int，level int，name int，val unsafe.Pointer，vallen*Socklen）（错误）
// sysnb socket（domain int，typ int，proto int）（fd int，error）
// sysnb socketpair（domain int，typ int，proto int，fd*[2]int32）（错误）
// sysnb getsockname（fd int，rsa*RawSockaddrAny，addrlen*_Socklen）（错误）
// /sys recvfrom（fd int，p[]byte，flags int，from*RawSockaddrAny，from*_Socklen）（n int，error）
// sys sendto（s int，buf[]byte，flags int，to unsafe.指针，addrlen(Socklen）（错误）
// sys recvmsg（s int，msg*Msghdr，flags int）（n int，错误）
// sys sendmsg（s int，msg*Msghdr，flags int）（n int，错误）
// sys mmap（地址uintptr，长度uintptr，保护int，标志int，fd int，偏移量int64）（xaddr uintptr，错误）

type sigset_t struct {
	X__val [16]uint64
}

// sys pselect（nfd int，r*FdSet，w*FdSet，e*FdSet，timeout*Timespec，sigmask*sigset_t）（n int，error error）=sys PSELECT6 

func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
	var ts *Timespec
	if timeout != nil {
		ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
	}
	return pselect(nfd, r, w, e, ts, nil)
}

// sys futimesat（dirfd int，path string，times*[2]Timeval）（error）
// sysnb Gettimeofday（tv*Timeval）（error）

func Time(t *Time_t) (tt Time_t, err error) {
	var tv Timeval
	err = Gettimeofday(&tv)
	if err != nil {
		return 0, err
	}
	if t != nil {
		*t = Time_t(tv.Sec)
	}
	return Time_t(tv.Sec), nil
}

// sys-Utime（路径字符串，buf*Utimbuf）（错误）
// sys-utimes（路径字符串，times*[2]Timeval）（错误）

func setTimespec(sec, nsec int64) Timespec {
	return Timespec{Sec: sec, Nsec: nsec}
}

func setTimeval(sec, usec int64) Timeval {
	return Timeval{Sec: sec, Usec: usec}
}

func Pipe(p []int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe2(&pp, 0)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}

// sysnb-pipe2（p*[2]\u-C_-int，flags-int）（错误）

func Pipe2(p []int, flags int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe2(&pp, flags)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}

func Ioperm(from int, num int, on int) (err error) {
	return ENOSYS
}

func Iopl(level int) (err error) {
	return ENOSYS
}

type stat_t struct {
	Dev        uint32
	Pad0       [3]int32
	Ino        uint64
	Mode       uint32
	Nlink      uint32
	Uid        uint32
	Gid        uint32
	Rdev       uint32
	Pad1       [3]uint32
	Size       int64
	Atime      uint32
	Atime_nsec uint32
	Mtime      uint32
	Mtime_nsec uint32
	Ctime      uint32
	Ctime_nsec uint32
	Blksize    uint32
	Pad2       uint32
	Blocks     int64
}

// sys fstat（fd int，st*stat_-t）（错误）
// sys lstat（路径字符串，st*stat t）（错误）
// sys stat（路径字符串，st*stat_t）（错误）

func Fstat(fd int, s *Stat_t) (err error) {
	st := &stat_t{}
	err = fstat(fd, st)
	fillStat_t(s, st)
	return
}

func Lstat(path string, s *Stat_t) (err error) {
	st := &stat_t{}
	err = lstat(path, st)
	fillStat_t(s, st)
	return
}

func Stat(path string, s *Stat_t) (err error) {
	st := &stat_t{}
	err = stat(path, st)
	fillStat_t(s, st)
	return
}

func fillStat_t(s *Stat_t, st *stat_t) {
	s.Dev = st.Dev
	s.Ino = st.Ino
	s.Mode = st.Mode
	s.Nlink = st.Nlink
	s.Uid = st.Uid
	s.Gid = st.Gid
	s.Rdev = st.Rdev
	s.Size = st.Size
	s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)}
	s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)}
	s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)}
	s.Blksize = st.Blksize
	s.Blocks = st.Blocks
}

func (r *PtraceRegs) PC() uint64 { return r.Regs[64] }

func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = pc }

func (iov *Iovec) SetLen(length int) {
	iov.Len = uint64(length)
}

func (msghdr *Msghdr) SetControllen(length int) {
	msghdr.Controllen = uint64(length)
}

func (cmsg *Cmsghdr) SetLen(length int) {
	cmsg.Len = uint64(length)
}

func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
